package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import Model.Plan;
import Model.PlanAdicional;
import Model.PlanBase;
import Model.PlanPrepago;

public class AdministradorPersistenciaPlan {
	private static AdministradorPersistenciaPlan instancia;
	
	private AdministradorPersistenciaPlan(){
		
	}
	
	public static AdministradorPersistenciaPlan getInstancia(){
		if(instancia == null)
			instancia = new AdministradorPersistenciaPlan();
		return instancia;
	}

	public Vector<Plan> buscarTodos() {
		Vector<Plan> planes = new Vector<Plan>();
		Plan plan = null;
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "SELECT * FROM Planes ORDER BY nroPlan";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ResultSet result = ps.executeQuery();
			
			while(result.next()){
				int nroPlan = result.getInt("nroPlan");
				String descripcion = result.getString("descripcion");
				int cantMinutosLibres = result.getInt("cantMinutosLibres");
				float costoAdicionalMinutosLibres = result.getFloat("costoAdMinLibre");
				int cantSms = result.getInt("cantSMS");
				float costoAdicionalSms = result.getFloat("costoAdSMS");
				int cantDatos = result.getInt("cantDatos");
				float costoAdicionalDatos = result.getFloat("costoAdDatos");
				boolean esAdicional = result.getBoolean("esAdicional");
				if(cantMinutosLibres == 0){
					plan = new PlanPrepago(nroPlan, descripcion);
				}else if(esAdicional){
					plan = new PlanAdicional(nroPlan, descripcion, cantMinutosLibres, costoAdicionalMinutosLibres, cantSms, costoAdicionalSms, cantDatos, costoAdicionalDatos );
				}else{
					plan = new PlanBase(nroPlan, descripcion, cantMinutosLibres, costoAdicionalMinutosLibres, cantSms, costoAdicionalSms, cantDatos, costoAdicionalDatos );
				}
				plan.setServicios(AdministradorPersistenciaServicio.getInstancia().buscarServiciosPlan(nroPlan));
				planes.add(plan);
			}
			
			result.close();
			PoolConnection.getPoolConnection().releaseConnection(con);
			return planes;
		} catch (SQLException e) {
			
			e.printStackTrace();
			return null;
		}
		
	}
	

	public Plan buscarPlan(int nroPlanABuscar) {
		Plan plan = null;
		Connection con = PoolConnection.getPoolConnection().getConnection();
		String sentencia = "SELECT * FROM Planes WHERE nroPlan = ?";
		
		try {
			PreparedStatement ps = con.prepareStatement(sentencia);
			ps.setInt(1, nroPlanABuscar);
			
			ResultSet result = ps.executeQuery();
			
			while(result.next()){
				int nroPlan = result.getInt("nroPlan");
				String descripcion = result.getString("descripcion");
				int cantMinutosLibres = result.getInt("cantMinutosLibres");
				float costoAdicionalMinutosLibres = result.getFloat("costoAdMinLibre");
				int cantSms = result.getInt("cantSMS");
				float costoAdicionalSms = result.getFloat("costoAdSMS");
				int cantDatos = result.getInt("cantDatos");
				float costoAdicionalDatos = result.getFloat("costoAdDatos");
				boolean esAdicional = result.getBoolean("esAdicional");
				if(cantMinutosLibres == 0){
					plan = new PlanPrepago(nroPlan, descripcion);
				}else if(esAdicional){
					plan = new PlanAdicional(nroPlan, descripcion, cantMinutosLibres, costoAdicionalMinutosLibres, cantSms, costoAdicionalSms, cantDatos, costoAdicionalDatos );
				}else{
					plan = new PlanBase(nroPlan, descripcion, cantMinutosLibres, costoAdicionalMinutosLibres, cantSms, costoAdicionalSms, cantDatos, costoAdicionalDatos );
				}
				plan.setServicios(AdministradorPersistenciaServicio.getInstancia().buscarServiciosPlan(nroPlan));
			}
			
			result.close();
			PoolConnection.getPoolConnection().releaseConnection(con);
			
			return plan;
		} catch (SQLException e) {
			e.printStackTrace();
			return plan;
		}
	}
}
